/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.AutorDao;
import DAO.Conexao;
import DAO.ConexaoPostgres;
import DAO.SignificadoDao;
import DAO.VerbeteDao;
import bean.Autor;
import bean.Obra;
import bean.Significado;
import bean.Verbete;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author jorge
 */
@ManagedBean
@SessionScoped
public class VerbeteBean implements Serializable {

    /**
     * Creates a new instance of VerbeteBean
     */
    public VerbeteBean() {
        this.verbete = new Verbete();
        this.verbeteDao = new VerbeteDao();
        this.conexao = new ConexaoPostgres();
        this.obraAdicionada = new Obra();
        this.autorAdicionado = new Autor();
        this.significado = new Significado();
        this.listaAutores = new ArrayList<Autor>();

        this.significadoDao = new SignificadoDao();

    }

    public void novoVerbete() {
        System.out.println("Novo Verbete Criado!");
        this.verbete = new Verbete();
        this.verbeteDao = new VerbeteDao();
        this.conexao = new ConexaoPostgres();
        this.obraAdicionada = new Obra();
        this.autorAdicionado = new Autor();
        this.significado = new Significado();
        this.listaAutores = new ArrayList<Autor>();

    }

    public String cadastroNovoVerbete() {
        String resultado = "/cadastros/acaoErro.xhtml?faces-redirect=true";

        verbeteDao = new VerbeteDao();
        System.out.println("Verbete:" + verbete.getTitulo());
        System.out.println("Significado:" + significado.getSignificado());
        this.addSignificado();
        if (verbeteDao.validarVerbeteJaCadastrado(verbete)) {
            sucesso = verbeteDao.cadastrarNovoVerbete(verbete);

            if (sucesso) {
                this.novoVerbete();
                this.carregarVerbetes();
                return "/cadastros/glossario/cadastro/cadastroSucesso";

            }
        } else {
            this.novoVerbete();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Autor já se encontra cadastrado na base de dados"));

        }
        return resultado;
    }

    public void validarAutoJaCadastrado(FacesContext context, UIComponent toValidate, Object value) {

        if (!verbeteDao.validarVerbeteJaCadastrado(verbete)) {
            ((UIInput) toValidate).setValid(false);

            FacesMessage message = new FacesMessage("Já possuímos um verbete cadastrado com esse nome!");
            context.addMessage(toValidate.getClientId(context), message);
        }
    }

    public String cadastroNovoSignificado() {
        String resultado = "/cadastros/acaoErro";

        significadoDao = new SignificadoDao();
        System.out.println("VerbeteBean - CadastroNovoSignificado");
        System.out.println("Id Verbete: " + verbete.getId());
        System.out.println("Significado: " + significado.getSignificado());
        significado.setAutores(listaAutores);
        if (significadoDao.cadastrarSignificado(verbete, significado)) {

            resultado = "/cadastros/glossario/cadastro/cadastroSucesso";
        }
        this.novoVerbete();
        this.carregarVerbetes();
        return resultado;
    }

    public String validarSignificadoCadastroVerbete() {
        String resultado = "";
        significadoDao = new SignificadoDao();
        if (significadoDao.validarSignificado(significado)) {
            return "/cadastros/glossario/cadastro/cadastroNovoVerbete2";
        } else {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().getFlash().setKeepMessages(true);
            context.addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção: Significado já cadastrado em nossa base de dados! ",
                    "key2"));
        }

        return resultado;
    }
    
    public String validarSignificadoCadastroSignificado() {
        String resultado = "";
        significadoDao = new SignificadoDao();
        if (significadoDao.validarSignificado(significado)) {
            return "/cadastros/glossario/cadastro/cadastroNovoSignificado2";
        } else {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().getFlash().setKeepMessages(true);
            context.addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção: Significado já cadastrado em nossa base de dados!",
                    "key2"));
        }

        return resultado;
    }

    public String editarSignificado() {
        String resultado = "/cadastros/acaoErro";

        significadoDao = new SignificadoDao();
        System.out.println("VerbeteBean - EditarSignificado");
        System.out.println("Significado: " + significado.getSignificado() + significado.getId());
        System.out.println("VerbeteBean - editarSignificado: Autores do Significado" + listaAutores.toString());
        significado.setAutores(listaAutores);
        if (significadoDao.alterarSignificado(significado)) {
            resultado = "/cadastros/glossario/listar/listar";
            this.novoVerbete();
            this.carregarVerbetes();

            return resultado;
        }



        return resultado;
    }

    public String editarVerbete() {
        String resultado = "/cadastros/acaoErro";

        verbeteDao = new VerbeteDao();

        sucesso = verbeteDao.alterarVerbete(verbete);


        if (sucesso) {
            this.novoVerbete();
            this.carregarVerbetes();
            return "/cadastros/glossario/listar/listar";

        }
        return resultado;
    }

    public String consultarVerbeteTitulo() {
        String resultado = "";
        verbeteDao = new VerbeteDao();
        resultadoPesquisa = null;
        System.out.println(consultaVerbete);

        resultadoPesquisa = verbeteDao.consultarVerbetes(consultaVerbete);
        if (resultadoPesquisa != null) {
            resultado = "/eixo_inovacao/resultado_pesquisa_verbetes.xhtml?faces-redirect=true";
        }



        return resultado;

    }

    public String consultarVerbeteTitulo(int opcao) {
        switch (opcao) {

            case 1: {
                System.out.println("Entrei no case a");
                consultaVerbete = "a";
            }

            break;

            case 2:
                consultaVerbete = "b";

                break;

            case 3:

                consultaVerbete = "c";

                break;

            case 4:

                consultaVerbete = "d";

                break;

            case 5:

                consultaVerbete = "e";

                break;

            case 6:

                consultaVerbete = "f";

                break;

            case 7:

                consultaVerbete = "g";

                break;

            case 8:

                consultaVerbete = "h";

                break;

            case 9:

                consultaVerbete = "i";

                break;

            case 10:

                consultaVerbete = "j";

                break;

            case 11:

                consultaVerbete = "k";

                break;

            case 12:

                consultaVerbete = "l";

                break;

            case 13:

                consultaVerbete = "m";

                break;

            case 14:

                consultaVerbete = "n";

                break;
            case 15:

                consultaVerbete = "o";

                break;
            case 16:

                consultaVerbete = "p";

                break;
            case 17:

                consultaVerbete = "q";

                break;
            case 18:

                consultaVerbete = "r";

                break;
            case 19:

                consultaVerbete = "s";

                break;
            case 20:

                consultaVerbete = "t";

                break;
            case 21:

                consultaVerbete = "u";

                break;
            case 22:

                consultaVerbete = "v";

                break;

            case 23:

                consultaVerbete = "w";

                break;
            case 24:

                consultaVerbete = "x";

                break;
            case 25:

                consultaVerbete = "y";

                break;
            case 26:

                consultaVerbete = "z";

                break;

            case 27:

                consultaVerbete = "";

                break;




        }
        String resultado = "";
        verbeteDao = new VerbeteDao();
        resultadoPesquisa = null;
        System.out.println(consultaVerbete);

        resultadoPesquisa = verbeteDao.consultarVerbetes(consultaVerbete);
        if (resultadoPesquisa != null) {
            resultado = "/eixo_inovacao/resultado_pesquisa_verbetes.xhtml?faces-redirect=true";
        }



        return resultado;

    }

    public String consultarVerbeteAutor() {
        String resultado = "";


        if (resultadoPesquisaVerbetePorAutor != null) {
            resultado = "/eixo_inovacao/visualizar_verbetes_autor.xhtml?faces-redirect=true";
        } else {
            resultadoPesquisaVerbetePorAutor = verbeteDao.consultarVerbetes("");
            resultado = "/eixo_inovacao/visualizar_verbetes_autor.xhtml?faces-redirect=true";
        }

        return resultado;

    }

    public String removerSignificado() {
        String resultado = "";

        if (significadoDao.removerSignificado(verbete, significado)) {
            this.carregarVerbetes();
            return "/cadastros/glossario/listar/listar.xhtml?faces-redirect=true";
        }
        return resultado;
    }


    /* 
     public String removerVerbete() {
     String resultado = "/cadastros/acaoErro";

     verbeteDao = new VerbeteDao();
       
     sucesso = verbeteDao.removerLivro(verbete);

     if (sucesso) {
     this.novoVerbete();
     this.carregarVerbetes();
     return "/cadastros/acaoSucesso";

     }

     return resultado;
     }
    
     */
    public void carregarVerbetes() {
        System.out.println("Verbete Bean - CarregarVerbetes - Fui Executado ");
        verbeteDao = new VerbeteDao();
        listaVerbetes = this.verbeteDao.listarVerbetes();
        resultadoPesquisaVerbetePorAutor = listaVerbetes;
        verbetes = new ListDataModel<Verbete>(listaVerbetes);
    }

    public DataModel<Verbete> getVerbetes() {
        if (verbetes == null) {
            this.carregarVerbetes();
        }
        return verbetes;
    }

    public void selecionar() {
        verbete = verbetes.getRowData();
        listaSignificados = verbete.getSignificados();
        significados = new ListDataModel<Significado>(listaSignificados);
    }

    public void selecionarSignificado() {
        significado = significados.getRowData();
        listaAutores = significado.getAutores();

        System.out.println("Significado: " + significado.getId() + significado.getSignificado());

    }

    public void addSignificado() {
        significado.setAutores(listaAutores);
        ArrayList<Significado> sig = this.verbete.getSignificados();
        sig.add(significado);
        this.verbete.setSignificados(sig);
    }

    public VerbeteDao getVerbeteDao() {
        return verbeteDao;
    }

    public void setVerbeteDao(VerbeteDao verbeteDao) {
        this.verbeteDao = verbeteDao;
    }

    public Verbete getVerbete() {
        return verbete;
    }

    public void setVerbete(Verbete verbete) {
        this.verbete = verbete;
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    public void setVerbetes(DataModel<Verbete> verbetes) {
        this.verbetes = verbetes;
    }

    public boolean isSucesso() {
        return sucesso;
    }

    public void setSucesso(boolean sucesso) {
        this.sucesso = sucesso;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public List<Verbete> getListaVerbetes() {
        if (listaVerbetes == null) {
            this.carregarVerbetes();
        }
        return listaVerbetes;
    }

    public void setListaVerbetes(List<Verbete> listaVerbetes) {
        this.listaVerbetes = listaVerbetes;
    }

    public Obra getObraAdicionada() {
        return obraAdicionada;
    }

    public void setObraAdicionada(Obra obraAdicionada) {
        this.obraAdicionada = obraAdicionada;
    }

    public ArrayList<Verbete> getFiltroVerbetes() {
        return filtroVerbetes;
    }

    public void setFiltroVerbetes(ArrayList<Verbete> filtroVerbetes) {
        this.filtroVerbetes = filtroVerbetes;
    }

    public Verbete getVerbeteSelecionado() {
        return verbeteSelecionado;
    }

    public void setVerbeteSelecionado(Verbete verbeteSelecionado) {
        this.verbeteSelecionado = verbeteSelecionado;
    }

    public Significado getSignificado() {
        return significado;
    }

    public void setSignificado(Significado significado) {
        this.significado = significado;
    }

    public Autor getAutorAdicionado() {
        return autorAdicionado;
    }

    public void setAutorAdicionado(Autor autorAdicionado) {
        this.autorAdicionado = autorAdicionado;
    }

    public void addAutor() {
        AutorDao ad = new AutorDao();
        System.out.println("Id antes: " + autorAdicionado.getId());
        autorAdicionado = ad.consultaAutor(autorAdicionado.getId());
        System.out.println(autorAdicionado.getId());
        listaAutores.add(autorAdicionado);
        autorAdicionado = new Autor();
    }

    public void selecionarAutor() {
        autorAdicionado = autores.getRowData();
    }

    public DataModel<Autor> getAutores() {
        autores = new ListDataModel<Autor>(listaAutores);
        return autores;
    }

    public void removerAutor() {
        Autor autorSelecionado = autores.getRowData();
        System.out.println("Autor Selecionado: " + autorSelecionado.getId());
        boolean remover = this.listaAutores.remove(autorSelecionado);
    }

    public ArrayList<Autor> getListaAutores() {
        return listaAutores;
    }

    public void setListaAutores(ArrayList<Autor> listaAutores) {
        this.listaAutores = listaAutores;
    }

    public String getAutoresToString() {
        autoresToString = new String();
        Iterator i = listaAutores.iterator();
        Autor a = new Autor();
        while (i.hasNext()) {
            a = (Autor) i.next();
            String nomeAutor = a.getUltimoNome() + ", " + a.getRestanteNome() + "; " + "<br />";

            autoresToString = autoresToString + nomeAutor;
        }


        return autoresToString;
    }

    public void setAutoresToString(String autoresToString) {
        this.autoresToString = autoresToString;
    }

    public DataModel<Significado> getSignificados() {
        //significados = new ListDataModel<Significado>(listaSignificados);
        return significados;
    }

    public void setSignificados(DataModel<Significado> significados) {
        this.significados = significados;
    }

    public SignificadoDao getSignificadoDao() {
        return significadoDao;
    }

    public void setSignificadoDao(SignificadoDao significadoDao) {
        this.significadoDao = significadoDao;
    }

    public List<Significado> getListaSignificados() {
        return listaSignificados;
    }

    public void setListaSignificados(List<Significado> listaSignificados) {
        this.listaSignificados = listaSignificados;
    }

    public List<Verbete> getResultadoPesquisa() {
        return resultadoPesquisa;
    }

    public void setResultadoPesquisa(List<Verbete> resultadoPesquisa) {
        this.resultadoPesquisa = resultadoPesquisa;
    }

    public String getConsultaVerbete() {
        return consultaVerbete;
    }

    public void setConsultaVerbete(String consultaVerbete) {
        this.consultaVerbete = consultaVerbete;
    }

    public String getPularLinha() {
        return pularLinha;
    }

    public void setPularLinha(String pularLinha) {
        this.pularLinha = pularLinha;
    }

    public List<Verbete> getResultadoPesquisaVerbetePorAutor() {

        return resultadoPesquisaVerbetePorAutor;
    }

    public void setResultadoPesquisaVerbetePorAutor(List<Verbete> resultadoPesquisaVerbetePorAutor) {
        this.resultadoPesquisaVerbetePorAutor = resultadoPesquisaVerbetePorAutor;
    }
    private Autor autorAdicionado = new Autor();
    private Significado significado;
    private VerbeteDao verbeteDao;
    private Verbete verbete;
    private PreparedStatement ps;
    private DataModel<Verbete> verbetes;
    private DataModel<Autor> autores;
    private DataModel<Significado> significados;
    private ArrayList<Autor> listaAutores;
    private boolean sucesso = false;
    private Conexao conexao;
    private List<Verbete> listaVerbetes;
    private List<Significado> listaSignificados;
    private Obra obraAdicionada;
    private ArrayList<Verbete> filtroVerbetes;
    private Verbete verbeteSelecionado;
    private String autoresToString;
    private SignificadoDao significadoDao;
    private List<Verbete> resultadoPesquisa;
    private List<Verbete> resultadoPesquisaVerbetePorAutor;
    private String consultaVerbete;
    private String pularLinha = "<br/>";
}
